//导入数据库操作模块
const db = require('../db/index')
//导入密码加密模块
const bcrypt = require('bcryptjs')
//导入生成token的包
const jwt = require('jsonwebtoken')
//注册用户的处理函数
exports.regUser = (req,res) => {
  const userinfo = req.body
  //判断数据是否合法
  if(!userinfo.mobile || !userinfo.password){
    return res.send({ status:1,message:'手机号和密码不能为空' })
  }
  let username = '神秘人'
  const sql = `select * from user where mobile = ?`
  db.query(sql,userinfo.mobile,(err,results)=>{
    if(err){
      return res.cc(err.message)
    }
    if(results.length>0){
      return res.cc('电话号码已被使用，请更换注册的电话号码')
    }
    //电话号码查重完成进入用户名验证阶段
    if(!userinfo.username){
      // console.log('用户没有设置用户名')
      //自定义用户名 进入存储用户数据操作
      username ='用户' + userinfo.mobile
      userinfo.password = bcrypt.hashSync(userinfo.password,10)
      //定义插入用户的SQL语句
      const sql = `insert into user set ?`
      db.query(sql,{username:username,mobile:userinfo.mobile,password:userinfo.password},function(err,results){
        //执行sql语句失败
        if(err) return res.send({status:1,message:err.message})
        //执行SQL语句成功但影响行数不唯一
        if(results.affectedRows !== 1){
          return res.send({ status:1,message:'用户注册失败，请稍后重试' })
        }
        //注册成功
        res.send({ status:0,message:'注册成功' })
      })
    }else{
      // console.log('用户设置了用户名')
      // 查询是否有用户使用过该用户名
      username = userinfo.username
      const sql = `select * from user where username =?`
      db.query(sql,username,(err,results)=>{
        if(err){
          return res.send({status:1,message:'请更换昵称'})
        }
        if(results.length > 0){
          return res.send({ status:1,message:'用户名已被使用'})
        }
        console.log(err)
        //用户名可用 进入存储用户数据操作
        userinfo.password = bcrypt.hashSync(userinfo.password,10)
        //定义插入用户的SQL语句
        const sql = `insert into user set ?`
        db.query(sql,{username:username,mobile:userinfo.mobile,password:userinfo.password},function(err,results){
          //执行sql语句失败
          if(err) return res.send({status:1,message:err.message})
          //执行SQL语句成功但影响行数不唯一
          if(results.affectedRows !== 1){
            return res.send({ status:1,message:'用户注册失败，请稍后重试' })
          }
          //注册成功
          res.send({ status:0,message:'注册成功' })
        })
        })
    }
  })
}

//登录的处理函数
exports.login = (req,res) =>{
  const userinfo = req.body
  //判断数据是否合法
  if(!userinfo.mobile || !userinfo.password){
    return res.send({ status:1,message:'手机号和密码不能为空' })
  }
  const sql = `select * from user where mobile =?`
  db.query(sql,userinfo.mobile,function(err,results){
    //执行SQL语句失败
    if(err) return res.cc(err)
    //执行SQL语句成功 但是查询到的数据条数不等于1
    if(results.length !== 1)return res.cc('登录失败')
    //用用户输入的密码与数据库中的密码进行对比
    const compareResult = bcrypt.compareSync(userinfo.password,results[0].password)
    if(!compareResult){
      return res.cc('密码错误请重试')
    }
    //剔除关键信息生成token
    const user = {...results[0],password:'',avatar:''}
    //导入配置文件
    const config = require('../config')
    //生成Token字符串
    const tokenStr = jwt.sign(user,config.jwtSecretKey,{
      expiresIn:'10h',//token有效期为10小时
    })
    //登录成功将用户信息交给客户端渲染
    res.send({
      status:0,
      message:'登录成功！',
      token:'Bearer ' + tokenStr,
      results:{
        avatar:results[0].avatar,
        id:results[0].id,
        mobile:results[0].mobile,
        username:results[0].username,
        email:results[0].email,
        token:'Bearer ' + tokenStr
      }
    })
  })
}